package com.yunhe.abnormal.service.base;

import com.yunhe.abnormal.domain.base.AbnormalStatus;
import com.yunhe.common.exception.ArgumentErrorException;
import com.yunhe.common.exception.ObjectNotFoundException;
import com.yunhe.common.exception.UniqueConstraintsException;
import com.yunhe.common.model.base.AbnormalStatusDTO;

import java.util.List;
import java.util.Optional;

public interface AbnormalStatusService {

    /**
     * 新增设备异常类型
     * @param AbnormalStatus 设备异常类型对象
     */
    AbnormalStatusDTO createAbnormalStatus(AbnormalStatus AbnormalStatus)
            throws ArgumentErrorException, UniqueConstraintsException, ObjectNotFoundException;

    /**
     * 批量新增设备异常类型
     * @param AbnormalStatusList 设备异常类型对象列表
     */
    Iterable<AbnormalStatusDTO> createAbnormalStatus(List<AbnormalStatus> AbnormalStatusList)
            throws ArgumentErrorException, UniqueConstraintsException, ObjectNotFoundException;

    /**
     * 删除设备异常类型
     * @param id 设备异常类型ID
     */
    void deleteAbnormalStatus(Long id);

    /**
     * 更新设备异常类型（更新全部字段）
     * @param AbnormalStatus 设备异常类型对象
     */
    AbnormalStatusDTO updateAbnormalStatus(AbnormalStatus AbnormalStatus)
            throws ArgumentErrorException, UniqueConstraintsException, ObjectNotFoundException;

    /**
     * 更新设备异常类型（更新指定字段）
     * @param id 设备异常类型ID
     * @param code 代码
     * @param name 编号
     * @param title 标题
     * @param sn 排序序号
     * @param activity 是否可用
     */
    AbnormalStatusDTO updateAbnormalStatus(Long id,
                                           Optional<Long> code,
                                           Optional<String> name,
                                           Optional<String> title,
                                           Optional<Long> sn,
                                           Optional<Boolean> activity)
            throws ArgumentErrorException, ObjectNotFoundException, UniqueConstraintsException;

    /**
     * 根据ID获得设备异常类型对象
     * @param id 状态ID
     */
    AbnormalStatusDTO findById(Long id);

    /**
     * 根据代码获得设备异常类型对象
     * @param code 代码
     */
    AbnormalStatusDTO findByCode(Long code);

    /**
     * 根据编号获得设备异常类型对象
     * @param name 编号
     */
    AbnormalStatusDTO findByName(String name);

    /**
     * 获得全部设备异常类型对象
     */
    Iterable<AbnormalStatusDTO> findAll();

    void bindAlarmStatus(Long code, List<Long> statusCodes);
}
